﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace 时钟壁纸应用.主要窗口
{
    public class 窗口状态
    {
       public double 屏幕宽度 { get; set; } = System.Windows.SystemParameters.PrimaryScreenWidth;
       public double 屏幕长度 { get; set; } = System.Windows.SystemParameters.PrimaryScreenHeight;
       public bool 播放器打开状态 { get; set; } = false;
       public 无缝播放器.MainWindow 当前播放器 { get; set; } = null;
       public bool 待办事项打开状态 { get; set; } = false;
       public 任务管理器.任务管理器侧边栏 当前待办事项 { get; set; } = null;
        public bool 运行 { get; set; } = true;

    }
    /// <summary>
    /// 用于管理时钟的状态
    /// </summary>
    public class 时钟状态
    {
        #region 当前时钟状态的枚举类型
        /// <summary>
        /// 是否要在界面上显示时钟
        /// </summary>
        public enum 全局显示
        {
            /// <summary>
            /// 打开全局显示，在指定的界面上显示时钟
            /// </summary>
            开,
            /// <summary>
            /// 关闭全局显示，隐藏时钟并清理更新线程
            /// </summary>
            关
        }
        /// <summary>
        /// 是否要显示界面上的时钟点
        /// </summary>
        public enum 分隔符
        {
            /// <summary>
            /// 指示界面上的分隔点“：”当前的状态是显示状态
            /// </summary>
            显示,
            /// <summary>
            /// 指示界面上的分隔点“：”当前的状态是隐藏状态
            /// </summary>
            隐藏
        }
        /// <summary>
        /// 用户指示当前界面的更新是用户触发，还是系统自动触发的
        /// </summary>
        public enum 更新模式
        {
            /// <summary>
            /// 指示现在界面上的时钟是系统通过倒计时等功能自动触发的
            /// </summary>
            自动触发o半时与整时,
            自动触发o倒计时与闹钟,
            自动触发o双重触发,
            /// <summary>
            /// 指示现在界面上的时钟是通过用户按下快捷键等方式手动触发的
            /// </summary>
            手动触发,
            /// <summary>
            /// 当前并没有触发，界面是隐藏状态
            /// </summary>
            未触发
        }
        /// <summary>
        /// 指示当前的闹钟与倒计时方式
        /// </summary>
        public enum 闹钟状态
        {
            /// <summary>
            /// 指示现在将准备播放一个提醒，且距离提醒的时间已经小于1分钟
            /// </summary>
            等待提醒,
            /// <summary>
            /// 指示现在将准备播放一个提醒，且距离提醒的时间大于1分钟
            /// </summary>
            提醒,
            /// <summary>
            /// 指示现在将准备播放一个循环闹钟，且距离闹钟的时间已经小于1分钟
            /// </summary>
            等待闹钟,
            /// <summary>
            /// 指示现在将准备播放一个闹钟，且距离提醒的时间大于1分钟
            /// </summary>
            闹钟,
            /// <summary>
            /// 指示现在并未设定任何提醒或者是闹钟
            /// </summary>
            未设定
        }
        public enum 光标状态
        { 
        在选项上,
        在选项外
        }
        #endregion
        #region 全局状态
       
        /// <summary>
        /// 是否要显示时钟的主体总成，如果为开，则显示，如果不为开则不显示
        /// </summary>
        public 全局显示 总成状态 { get; set; } = 全局显示.关;
        /// <summary>
        /// 是否要显示时钟上的点。
        /// </summary>
        public 分隔符 点状态 { get; set; } = 分隔符.隐藏;
        /// <summary>
        /// 当前时钟显示是用户触发的还是系统触发的。
        /// </summary>
        public 更新模式 更新状态 { get; set; } = 更新模式.未触发;
        /// <summary>
        /// 指示当前设定的提醒模式
        /// </summary>
        public 闹钟状态 提醒状态 { get; set; } = 闹钟状态.未设定;
        public 光标状态 光标位置 { get; set; } = 光标状态.在选项外;
        /// <summary>
        /// 设置在前台显示时，程序时间的刷新间隔
        /// </summary>
        public int 当前刷新间隔 { get; set; } = 500;
        /// <summary>
        /// 管理时钟应用的多线程池
        /// </summary>
        public List<Thread> 线程池 = new List<Thread>();
        /// <summary>
        /// 指示当前时间应该设置为的壁纸
        /// </summary>
        public string 目标壁纸路径 = "";
        /// <summary>
        /// 指示当前系统设置的壁纸路径
        /// </summary>
        public string 当前壁纸路径 = "";
        #endregion
    }
    /// <summary>
    /// 用于修改时钟状态的便捷方法
    /// </summary>
    public class 修改状态
    {
        #region 状态更新的重载方法
        时钟状态 状态 = new 时钟状态();
        public void 更新状态(时钟状态.全局显示 全局状态, 时钟状态.更新模式 触发方式, 时钟状态.闹钟状态 当前闹钟状态, 时钟状态.分隔符 是否显示点)
        {
            状态.总成状态 = 全局状态;
            状态.提醒状态 = 当前闹钟状态;
            状态.点状态 = 是否显示点;
            状态.更新状态 = 触发方式;
        }
        public void 更新状态(时钟状态.全局显示 全局状态)
        {
            状态.总成状态 = 全局状态;
        }
        public void 更新状态(时钟状态.更新模式 触发方式)
        {
            状态.更新状态 = 触发方式;
        }
        public void 更新状态(时钟状态.闹钟状态 当前闹钟状态)
        {
            状态.提醒状态 = 当前闹钟状态;
        }
        public void 更新状态(时钟状态.分隔符 是否显示点)
        {
            状态.点状态 = 是否显示点;
        }
        #endregion


    }
    /// <summary>
    /// 用于设定时间区间，该区间通过数组实现写入与访问
    /// </summary>
    public class 时间区间
    {
        /// <summary>
        /// 管理时间区间的数组
        /// </summary>
        string[] 时间区间表 = new string[24];
        /// <summary>
        /// 构造方法，初始化该表
        /// </summary>
        public 时间区间()
        {
            //初始化用于快速调取当前时间段的名称的字典
            for(int i = 0; i<24;i++)
            {
                时间区间表[i] = "时间";
            }
        }
        /// <summary>
        /// 新建一个时间区间
        /// </summary>
        /// <param name="时间段名称">输入要显实的时间段名称，闭区间</param>
        /// <param name="开始时段">此时间段从一天的几点开始（填入的时间节点仍然包含在现在你设定的时间段内）</param>
        /// <param name="结束时段">此时间段从一天的几点结束（填入的时间节点仍然包含在现在你设定的时间段内）</param>
        public void 新增时间区间(string 时间段名称,int 开始时段,int 结束时段)
        {
           for(int i = 开始时段; i<=结束时段; i++)
            {
                时间区间表[i] = 时间段名称;
                日志.输出($"时 {i} = {时间段名称}");
            }

            日志.输出($"已添加时间段数据{时间段名称}：{开始时段}-{结束时段}");
        }
        /// <summary>
        /// 取出时间区间
        /// </summary>
        /// <param name="当前小时">要取出的区间小时数</param>
        /// <returns></returns>
        public string 取当前时间区间(int 当前小时)
        {
            return 时间区间表[当前小时];


        }

    }
    public class 用户设置 
    { 
        #region 性能设置 
        /// <summary>
        /// 设定默认的刷新间隔时间
        /// </summary>
        public int 刷新间隔 { get; set; } = 500;
        /// <summary>
        /// 设定当程序在后台时，如已被隐藏时的刷新间隔时间
        /// </summary>
        public int 后台刷新间隔 { get; set; } = 1500;
        /// <summary>
        /// 设定一些非即时模块，如壁纸更换的监测间隔时间
        /// </summary>
        public int 非即时模块刷新间隔 { get; set; } = 360000;
        #endregion
        #region 闹钟设置
        /// <summary>
        /// 设定非闹钟模式下的铃声位置
        /// </summary>
        public string 闹钟_铃声位置 { get; set; } = @"\铃声\时钟应用 - 倒计时.wav";
        /// <summary>
        /// 设定下次开始响铃的时间
        /// </summary>
        public DateTime 闹钟_下次响铃时间 { get; set; } 
        /// <summary>
        /// 闹钟设定的时间
        /// </summary>
        public DateTime 闹钟_设定闹钟时间 { get; set; }
        /// <summary>
        /// 设定下次提醒的闹钟的标签
        /// </summary>
        public string 闹钟_提醒内容 { get; set; } = null;
        /// <summary>
        /// 设定下次提醒要播放的铃声
        /// </summary>
        public List<string> 闹钟_铃声组 { get; set; } = null;
        /// <summary>
        /// 一个枚举，存放了闹钟模式的选项
        /// </summary>
        /// 
        public enum 闹钟模式
        { 
        仅提醒,
        循环闹钟,
        关闭
        }
        /// <summary>
        /// 设定下次是否为闹钟模式
        /// </summary>
        public 闹钟模式 闹钟_模式 { get; set; } =  闹钟模式.关闭;

        #endregion
        #region 壁纸设置
        /// <summary>
        /// 设定壁纸文件的路径
        /// </summary>
        public string 壁纸_文件夹路径 { get; set; } = null;
        #endregion 
        #region 配置文件路径
        public string 配置文件路径 { get; set; } = System.Environment.CurrentDirectory+@"\程序配置.txt";
        public string 铃声文件夹位置 { get; set; } = System.Environment.CurrentDirectory + "\\铃声";
        #endregion
        #region 快捷键
        public HotkeyModifiers 组合键 { get; set; } = HotkeyModifiers.MOD_ALT;
        public System.Windows.Input.Key 普通键 { get; set; } = System.Windows.Input.Key.T;
        #endregion
    }

}
